home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacApp Release 10 / MacApp Release 10 - HD Ready / Libraries / Core / Includes / UClassDesc.Private.h < prev    next >
Encoding:
Text File  |  1996-04-03  |  4.0 KB  |  119 lines  |  [TEXT/MPS ]

  1. // UClassDesc.Private.h
  2. // Copyright © 1984-96 by Apple Computer, Inc. All rights reserved.
  3.  
  4. #ifndef __UCLASSDESC_PRIVATE__
  5. #define __UCLASSDESC_PRIVATE__
  6.  
  7. //========================================================================================
  8. // Macros for generating and accessing class information
  9. //========================================================================================
  10.  
  11. // ----- Internal macros.
  12.  
  13. #define _MA_CLASSDESC(name) \
  14.     (&name::fgClassDesc)
  15.  
  16. #define _MA_CLASS_ANCESTORS(name) \
  17.     name::fgAncestors
  18.         
  19. #define _MA_CLASS_OFFSETS(name) \
  20.     name::fgAncestorOffsets
  21.         
  22. const unsigned long MA_kDummyAddress = 1024;
  23. #define _MA_BASE_OFFSET(derived, ancestor)    \
  24.     ((ptrdiff_t)(((char*)((ancestor*)((derived*)MA_kDummyAddress))) - (char*)MA_kDummyAddress))
  25.  
  26. #define _MA_DEFINE_CLASSINFO_OBJECT(name)                                                 \
  27.     const char* gClassName##name = #name;                                                \
  28.     const ClassDesc name::fgClassDesc(gClassName##name, sizeof(name),                    \
  29.                                       _MA_CLASS_ANCESTORS(name),                        \
  30.                                       _MA_CLASS_OFFSETS(name));
  31.  
  32. //----------------------------------------------------------------------------------------
  33.  
  34. #define _MA_CLASS_ANCESTORS_IMPLEMENT_M0(name)                                             \
  35.     const MA_ClassReference _MA_CLASS_ANCESTORS(name)[] =                                \
  36.     {                                                                                    \
  37.         0                                                                                \
  38.     };                                                                                    \
  39.     const ptrdiff_t _MA_CLASS_OFFSETS(name)[] =                                            \
  40.     {                                                                                    \
  41.         0                                                                                \
  42.     };
  43.  
  44. #define _MA_CLASS_ANCESTORS_IMPLEMENT_M1(name, a)                                        \
  45.     const MA_ClassReference _MA_CLASS_ANCESTORS(name)[] =                                \
  46.     {                                                                                    \
  47.         _MA_CLASSDESC(a),                                                                \
  48.         0                                                                                \
  49.     };                                                                                    \
  50.     const ptrdiff_t _MA_CLASS_OFFSETS(name)[] =                                            \
  51.     {                                                                                    \
  52.         _MA_BASE_OFFSET(name, a),                                                        \
  53.         0                                                                                \
  54.     };
  55.  
  56. #define _MA_CLASS_ANCESTORS_IMPLEMENT_M2(name, a1, a2)                                    \
  57.     const MA_ClassReference _MA_CLASS_ANCESTORS(name)[] =                                \
  58.     {                                                                                    \
  59.         _MA_CLASSDESC(a1),                                                                \
  60.         _MA_CLASSDESC(a2),                                                                \
  61.         0                                                                                \
  62.     };                                                                                    \
  63.     const ptrdiff_t _MA_CLASS_OFFSETS(name)[] =                                            \
  64.     {                                                                                    \
  65.         _MA_BASE_OFFSET(name, a1),                                                        \
  66.         _MA_BASE_OFFSET(name, a2),                                                        \
  67.         0                                                                                \
  68.     };
  69.  
  70. #define _MA_CLASS_ANCESTORS_IMPLEMENT_M3(name, a1, a2, a3)                                \
  71.     const MA_ClassReference _MA_CLASS_ANCESTORS(name)[] =                                \
  72.     {                                                                                    \
  73.         _MA_CLASSDESC(a1),                                                                \
  74.         _MA_CLASSDESC(a2),                                                                \
  75.         _MA_CLASSDESC(a3),                                                                \
  76.         0                                                                                \
  77.     };                                                                                    \
  78.     const ptrdiff_t _MA_CLASS_OFFSETS(name)[] =                                            \
  79.     {                                                                                    \
  80.         _MA_BASE_OFFSET(name, a1),                                                        \
  81.         _MA_BASE_OFFSET(name, a2),                                                        \
  82.         _MA_BASE_OFFSET(name, a3),                                                        \
  83.         0                                                                                \
  84.     };
  85.  
  86. #define _MA_CLASS_ANCESTORS_IMPLEMENT_M4(name, a1, a2, a3, a4)\
  87.     const MA_ClassReference _MA_CLASS_ANCESTORS(name)[] =                                \
  88.     {                                                                                    \
  89.         _MA_CLASSDESC(a1),                                                                \
  90.         _MA_CLASSDESC(a2),                                                                \
  91.         _MA_CLASSDESC(a3),                                                                \
  92.         _MA_CLASSDESC(a4),                                                                \
  93.         0                                                                                \
  94.     };                                                                                    \
  95.     const ptrdiff_t _MA_CLASS_OFFSETS(name)[] =                                            \
  96.     {                                                                                    \
  97.         _MA_BASE_OFFSET(name, a1),                                                        \
  98.         _MA_BASE_OFFSET(name, a2),                                                        \
  99.         _MA_BASE_OFFSET(name, a3),                                                        \
  100.         _MA_BASE_OFFSET(name, a4),                                                        \
  101.         0                                                                                \
  102.     };
  103.  
  104. //----------------------------------------------------------------------------------------
  105.  
  106. #define _MA_DEFINE_CLASS_METHODS(name)                                                    \
  107.     MA_ClassReference name::GetClassDescDynamic(void) const                                \
  108.     {                                                                                    \
  109.         return _MA_CLASSDESC(name);                                                        \
  110.     }                                                                                    \
  111.     void* name::_DefaultConstructor()                                                    \
  112.     {                                                                                    \
  113.         return new name;                                                                \
  114.     }
  115.  
  116. //----------------------------------------------------------------------------------------
  117.  
  118. #endif // __UCLASSDESC_PRIVATE__
  119.